Autor: Luis Fernando Apáez Álvarez
-Curso PyM-
Clase 2: Modificando una tabla, lenguajes DDL y DML.
Fecha: Marzo del 2023
En la clase pasada vimos la sintaxis para crear una tabla, la cual, básicamente, es
CREATE TABLE <<nombre de la tabla>>(
<<nombre columna 1>> <<tipo de dato>>,
<<nombre columna 2>> <<tipo de dato>>,
.
.
.
<<nombre columna n>> <<tipo de dato>>
);
Para esta clase crearemos una tabla de prueba, la cual será posteriormente eliminada. Así, usamos
CREATE TABLE prueba(
id_prueba SERIAL,
nombre_prueba VARCHAR,
fecha DATE
);
la cual, como ya sabemos, se mostrará dentro del esquema público en la parte de Tables
Los bloques de código que colocamos como:
-- este es un bloque de código
en las clases harán referencia directa código que se escribe en el Query tool de pgAdmin. Esto es, si nosotros escribimos algo como
SELECT * FROM productos;
ese mismo código es el que debes escribir en el Query tool de tu pgAdmin.
Una vez creada nuestra tabla de prueba procedemos a eliminarla, lo cual se consigue con la siguiente sintaxis
DROP TABLE prueba;
donde la ejecución ha sido exitosa
Luego, puede que sigamos viendo la tabla dentro del esquema público. Para actualizarlo damos click derecho en public y después click en Refresh
con lo cual deberías de conseguir que las únicas tablas que se muestran son las que creamos la clase pasada
Otra alternativa para eliminar una tabla es ir directamente a ella en el esquema público y pulsar click derecho, después seleccionamos la opción que dice Delete/Drop
Así, tendremos dos opciones cuando queramos eliminar una tabla: una, utilizando código SQL y la otra yendo a las opciones que nos brinda pgAdmin al dar click derecho en la tabla en cuestión.
De hecho, para eliminar una base de datos procederíamos a ir a dicha base y pulsar click derecho, después seleccionaríamos la opción Delete/Drop.
Supongamos que en la tabla empleados
olvidamos colocar la columna horario
. Si bien podríamos eliminar dicha tabla y después volverla a crear agregando la columna que nos faltó, este método después sería inconcebible pues imaginemos que dicha tabla cuenta ya con mil filas, entonces al eliminar la tabla perderíamos toda la información.
Para modificar una tabla y agregar una columna nueva utilizamos la siguiente sintaxis
ALTER TABLE <<nombre tabla>> ADD COLUMN <<nombre columna nueva>> <<tipo de dato>>;
Así, para agregar la columna horario
a la tabla empleados
escribimos
ALTER TABLE empleados ADD COLUMN horario VARCHAR;
Para ver los cambios, como ya sabemos, vamos a la tabla empleados
y damos click derecho, después pulsamos Refresh
, con lo cual deberíamos de ver
ya la columna horario
.
Podemos eliminar también columnas de una tabla. Para ejemplificar la eliminación de una columna, agregaremos primero otra columna nueva a la tabla empleados
ALTER TABLE empleados ADD COLUMN prueba DATE;
Así, eliminamos esta última columna escribiendo
ALTER TABLE empleados DROP COLUMN prueba;
Luego, podemos cambiar el nombre tanto de las tablas como de las columnas. Para cambiar el nombre de las tablas empleamos
ALTER TABLE <<nombre tabla>> RENAME TO <<nuevo nombre tabla>>;
y para cambiar el nombre de una columna
ALTER TABLE <<nombre tabla>> RENAME COLUMN <<nombre columna>> TO <<nuevo nombre columna>>;
Finalmente, podemos cambiar el tipo de dato de una columna. Esto no es recomendable hacerlo después, pues imaginemos que en la tabla empleados
en la columna salario
tenemos entradas como 8500.0, 15,250.80, etcétera; después, si cambiamos el tipo de dato de salario
de REAL
a INT
(por ejemplo) entonces postgres nos marcará un error. Así, si deseamos cambiar el tipo de dato de una columna, lo mejor es hacerlo en estas instancias en las que no hemos ingresado información a nuestras tablas. Además, es preciso mencionar que siempre debemos planificar bien la estructura de nuestras bases de datos, algo así a lo que hicimos en la clase pasada donde primero describimos brevemente cada columna de la tabla productos
e incluimos el tipo de dato que le asignaríamos a cada una.
Ahora, para cambiar el tipo de dato de una columna utilizamos la siguiente sintaxis
ALTER TABLE <<nombre tabla>> ALTER COLUMN <<nombre columna>> SET DATA TYPE <<tipo de dato>>;
Con el código anterior seguramente tendremos problemas a la hora de intentar cambiar el tipo de dato de una columna que almacena cadenas de texto a un tipo de dato numérico (por ejemplo al tipo de dato int
). Para realizar dicho cambio, escribiremos el código
ALTER TABLE <<nombre tabla>>s ALTER COLUMN <<nombre columna>> TYPE INT USING <<nombre columna>>::INTEGER;
Dentro del lenguaje SQL tenemos un sublenguaje denominado DDL el cual nos permite definir estructuras que almacenarán datos, así como funciones que permitan consultarlos. Las sentencias que ocupamos en el DDL son:
CREATE
: Lo utilizamos para crear bases de datos, tablas, funciones, vistas, etcétera.
ALTER
: Lo utilizamos para modificar la estructura. Por ejemplo añadir o modificar columnas, cambiar el nombre de tablas o columnas, etcétera.
DROP
: Nos permite eliminar objetos de la estructura. Por ejemplo, podemos eliminar bases de datos o tablas.
Así, si nos damos cuenta, hasta ahora en nuestras clases hemos estado utilizando el lenguaje de definición de datos en nuestro código sql.
Existen varios tipos de sublenguajes como el DDL, en esta clase sólo abordaremos otro sublenguaje el cual es:
Como bien dice el nombre, este sublenguaje se utiliza para manipular los datos de nuestra base de datos. Podemos consultar nuestros datos, insertar datos nuevos a las tablas, modificar los valores de los datos ya ingresados y también borrarlos. De tal manera, en el lenguaje DML utilizamos las sentencias
SELECT
: nos permite realizar consultas de nuestros datos.
INSERT
: nos permite insertar valores a nuestra base de datos (BD).
UPDATE
: nos permite modificar los datos ya ingresados en la BD.
DELETE
: nos permite eliminar filas de las tablas de la BD.
En esta clase trabajaremos con cada una de las sentencias mencionadas anteriormente.
Comenzaremos por ingresar información a nuestra base de datos. Para ello comenzaremos por ingresar la información en la tabla empleados. Para ello debemos saber bien cuáles son las columnas que la conforman y el tipo de dato que aceptan, pues si ingresamos (por ejemplo) un número real en una columna que admite enteros entonces postgres nos marcará error.
Por consiguiente, ingresaremos la información de un primer empleado utilizando el siguiente código
INSERT INTO empleados(nombre, app, apm, puesto, salario, horario) VALUES ('Luis', 'Apáez', 'Álvarez', 'Cajero', 8500.0, '6:00-14:00');
recordemos que las cadenas de texto, en particular del tipo varchar
, deben ir entre comillas simples; además, recordemos que la columna horario acepta datos del tipo cadena de texto, por ello el horario lo hemos colocado entre comillas simples, además el salario es de tipo real
, por ello colocamos 8500.0.
Notemos que donde colocamos el nombre de las columnas empleados(nombre, app, apm, puesto, salario, horario)
, omitimos la columna id_empleados
pues el tipo de dato con el cual la definimos es serial
el cual es un incremento automático partiendo del uno, es decir, el id_empleados
igual a 1 le corresponde al empleado que acabamos de registrar. Si registramos la información de otro empleado, entonces su id_empleados
será el número 2 y así consecutivamente.
De tal manera, la sintaxis general para ingresar datos a nuestras tablas es la siguiente:
INSERT INTO <<nombre tabla>> (<<columna 1>>, <<columna 2>>,..., <<columna n>>) VALUES
(<<valor columnas 1>>, <<valor columna 2>>,...,<<valor columna n>>);
Asimismo, podemos ingresar información solo en algunas columnas de una tabla. Por ejemplo, pudimos haber ingresado sólo el nombre del empleado en la tabla empleados
escribiendo
INSERT INTO empleados(nombre) VALUES ('Luis');
o solo ingresar un salario en una fila de la tabla, sin especificar otra cosa
INSERT INTO empleados(salario) VALUES (4500.5);
Recapitulando, hasta el momento sólo hemos ingresado un empleado a nuestra tabla empleados
. Para ver la información que hemos ingresado en esta tabla haremos uso de las consultas. Para los fines de este tema sólo veremos la consulta más sencilla de todas, la cual nos permite ver toda la informuación de nuestra tabla. Para efectuar una consulta que nos arroje toda la información de la tabla escribimos
SELECT * FROM <<nombre de la tabla>>;
De tal manera, en nuestro caso escribimos
SELECT * FROM empleados;
lo cual nos arroja al ejecutarlo lo siguiente:
donde puede verse que en automático se ha puesto el número 1 en el id_empleados
, además podemos ver los nombres de las columnas y el tipo de dato que admiten de acuerdo a cómo definimos las columnas.
Ahora, ingresemos el siguiente empleado omitiendo algunas columnas
INSERT INTO empleados(nombre, app, apm, horario) VALUES ('Zed', 'Ocaña', 'López', '6:00-13:00');
-- Después realizamos nuevamente una consulta
SELECT * FROM empleados;
donde puede verse que en las columnas donde no ingresamos información se ha colocado en automático la etiqueta null
. En muchas ocasiones, tener valores nulos no es lo más óptimo en una base de datos, en algunos otros casos no hay otra alternativa. Como en nuestro caso, el tener el registro de un empleado sin tener especificado el puesto que cubre no puede ocurrir, entonces ingresaremos la información que nos falta referente al empleado Zed. Para ello haremos uso de la sentencia UPDATE
, la cual nos permitirá actualizar información en nuestras tablas. La sintaxis básica es
UPDATE <<nombre tabla>> SET <<nombre columna>> = <<valor correspondiente>> WHERE <<condición>>;
En nuestro caso queremos cambiar los valores nulos de las columnas puesto
y salario
referente al empleado Zed (cuyo id_empleados
es igual a 2), donde pondremos en su lugar Vigilante
y 12500.5
respectivamente. Para ello
UPDATE empleados SET puesto = 'Vigilante' WHERE id_empleados = 2;
estamos colocando en la columna puesto
el valor 'Viglante'
en el empleado cuyo id_empleados
es igual a 2, es decir, estamos actualizando la información de Zed. También, en vez de utilizar al final WHERE id_empleados = 2
pudimos haber utilizado WHERE nombre = 'Zed'
, sin embargo, si en nuestra tabla tuviéramos dos empleados con el mismo nombre entonces tendríamos un problema. De ahí la importancia de tener un identificador único en cada tabla, que en este caso es el id_empleados
. Procedemos a agregar también el salario
UPDATE empleados SET salario = 12500.5 WHERE id_empleados = 2;
En vez de realizar dos UPDATES
podemos simplemente efectuar uno en la misma sentencia colocando una coma de separación entre cada columna, esto es
UPDATE empleados SET puesto = 'Vigilante', salario = 12500.5 WHERE id_empleados = 2;
o de manera más estética podemos escribir lo anterior como
UPDATE empleados
SET puesto = 'Vigilante',
salario = 12500.5
WHERE id_empleados = 2;
y realizamos una consulta para ver los cambios
SELECT * FROM empleados;
donde ya no tenemos los valores nulos que teníamos antes.
Continuando, ingresemos el siguiente "empleado":
INSERT INTO empleados(nombre, app, apm, puesto, salario, horario)
VALUES('ññ', 'ñ', 'uwu', 'ñe', 2.5, 'ññ')
la cual no tiene ningún sentido pero nos ayudará a utilizar la sentencia DELETE
. Una vez que consultamos la tabla
procedemos a eliminar la fila 3 con los datos que no tienen sentido, para ello escribimos
-- Recordemos que queremos eliminar la fila 3
DELETE FROM empleados WHERE id_empleados = 3;
y después consultamos para ver que la fila 3 ya no está en la tabla empleados
En conjunto ya hemos abordado las 4 sentencias de las que hablamos sobre el lenguaje de manipulación de datos (DML).